作为一个混迹于SfM学术界,SLAM工业界的同学,先来先表明一下观点: 很多回答都不太准确,包括深蓝学院。
前面很多答主提到,SLAM和三维重建比较并不准确,那就假设题主是想和SfM比吧。其实更准确的说是视觉SLAM和SfM。
这两种方法的区别在于面向的任务不同: SLAM主要用于实时应用,比如机器人,我们希望SLAM算法能在机器人行走过程中实时进行建图和定位;而SfM主要用于建图,比如航拍场景,输出的稀疏点云和pose用于之后的MVS。
由于应用的场景和期望的目的不同,自然在算法设计上就会有很大的差异。
首先讲第一个异同。视觉SLAM和SfM都需要先从图像数据中提取需要的interest points(这里不说特征点,因为视觉SLAM包括直接法和特征点法)。对于视觉SLAM,为了保证实时性,interest points的提取需要足够快,同时鲁棒性也不能太差。像SIFT和SURF这类的方法由于过重通常被大多数SLAM应用抛弃,于是有了后来的ORB。而SfM算法更追求精度,速度是第二位,因此偏爱SIFT这类算法。当然,随着深度学习的发展,很多工作在使用深度学习算法来提取特征点。
第二个异同点在于如何在图片对或者相邻帧之间找匹配。以ORB为例,SLAM算法为了实时性,使用的是ORB的二进制描述子计算汉明距离,计算量比较小。使用SIFT的SfM算法则使用得到的特征点的128维描述子: 使用ANN的话,则建立KD-Tree后找近邻点;当然也可以使用cascade hashing算法来加速匹配过程。匹配时,SLAM通常只进行相邻帧或者一个窗口内的连续帧的匹配,需要匹配的图片对很少。而SfM则需要对每一张图片,和它们的k个可能的图片进